package cn.itsource.ymjs.service.impl;

import cn.itsource.ymjs.entity.CourseType;
import cn.itsource.ymjs.query.CourseQuery;
import cn.itsource.ymjs.repository.CourseTypeRepository;
import cn.itsource.ymjs.service.ICourseTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author SuperJellyfish
 * @description TODO
 * @date 2022/2/3 16:30
 */
@Transactional(rollbackFor = Exception.class)
@Service
public class CourseTypeServiceImpl extends BaseServiceImpl<CourseType, CourseQuery> implements ICourseTypeService {
    @Autowired
    private CourseTypeRepository courseTypeRepository;
    @Override
    public List<CourseType> getTreeData() {
        // 获取到所有的课程类型
        List<CourseType> result = courseTypeRepository.findAll();
        // 定义一个map容器
        Map<Long, CourseType> map = new HashMap<>(16);
        // 装所有的顶级类型
        List<CourseType> list = new ArrayList<>();
        result.forEach(courseType -> {
            map.put(courseType.getId(), courseType);
        });
        // 遍历map将所有的子类型装进到父类型中
        // Hibernate 通过注解方式直接实现了这种外键关联的关系可以不用写下面的逻辑代码
//        result.forEach(courseType -> {
//           if (null != courseType.getPid()) {
//               List<CourseType> children = map.get(courseType.getPid()).getChildren();
//               children.add(courseType);
//               map.get(courseType.getPid()).setChildren(children);
//           }
//        });
        // 将所有的父类装进新集合中
        map.forEach((id, courseType) -> {
            if (courseType.getPid() == null) {
             list.add(courseType);
            }
        });
        return list;
    }
}
